package 线程的学习;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/*
 * 线程互斥的学习
 *临界区加锁有两种格式
 * 这个类最后并没有停止，考虑下为啥？
 * */
public class LockTest {
    public static void main(String[] args) {
        Share1 share=new Share1();
//        改成run方法并不会出现 不同，start 方法才是调用线程 运行的正确做法
        new AddThread1(share).start();
        new DecThread1(share).start();
        new DecThread1(share).start();
        System.out.println("----------");
    }

}

class Share1{
    private int a;
    public Share1(){
        a=0;
    }
    public Share1(int d){
        this.a=d;
    }
    private Lock locker=new ReentrantLock();
    //临界区1，对共享数据加1
    public  void add(){
        locker.lock();
        try{

            a=a+1;
            System.out.println("ADD:"+a);}
       finally {
            locker.unlock();
        }
    }
    //        临界区2,对共享数据进行减1操作
    public   void dec(){
        locker.lock();
        if(a>0){
            try{
                a=a-1;
                System.out.println("DEC:"+a);
            }finally {
                locker.unlock();
            }

        }
    }
}


//对共享数据做加一操作的线程
class AddThread1 extends Thread{
    private Share1 s1;
    public AddThread1(Share1 s3){
        this.s1=s3;
    }
    public void run(){
        for(int i=0;i<=100;i++){
            s1.add();
            yield();
        }
    }
}
//对共享数据做减一操作的线程
class DecThread1 extends Thread{
    private Share1 s2;
    public DecThread1(Share1 s4){
        this.s2=s4;
    }
    public void run(){
        for(int i=0;i<=100;i++){

            s2.dec();
            yield();
        }
    }
}
